package email;

import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import javax.ejb.Remove;
import javax.ejb.Stateless;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

@Stateless(name = "EmailInterface")
public class EmailBean implements EmailInterface {

    private static final String SMTP_HOST_NAME = "smtp.gmail.com";
    private static final int SMTP_HOST_PORT = 465;
    private static final String SMTP_AUTH_USER = "academiapuc@gmail.com";
    private static final String SMTP_AUTH_PWD = "BSI@1234";
    private Set<String> para;
    private Set<String> cc;
    private Set<String> cco;
    private String titulo;
    private String corpo;

    public EmailBean() {
        para = new HashSet<String>();
        cc = new HashSet<String>();
        cco = new HashSet<String>();
    }

    @Override
    public void criarMensagem(String titulo, String corpo) {
        this.titulo = titulo;
        this.corpo = corpo;
    }

    @Override
    public void adicionarDestinatario(String destinatario, TipoDestinatario tipo) {
        switch (tipo) {
            case PARA:
                para.add(destinatario);
                break;
            case CC:
                cc.add(destinatario);
                break;
            case CCO:
                cco.add(destinatario);
                break;
            default:
                throw new IllegalArgumentException("Tipo inválido: " + tipo);
        }
    }

    @Override
    public void removerDestinatario(String destinatario, TipoDestinatario tipo) {
        switch (tipo) {
            case PARA:
                para.remove(destinatario);
                break;
            case CC:
                cc.remove(destinatario);
                break;
            case CCO:
                cco.remove(destinatario);
                break;
            default:
                throw new IllegalArgumentException("Tipo inválido: " + tipo);
        }
    }

    @Override
    @Remove
    public void enviar() throws ErroValidacaoMailException {

        try {

            if (para.isEmpty() && cc.isEmpty() && cco.isEmpty()) {
                throw new ErroValidacaoMailException("Nenhum destinatário selecionado");
            }

            if (titulo == null || corpo == null) {
                throw new ErroValidacaoMailException("Título e corpo devem ser preenchidos");
            }

            Properties props = new Properties();

            props.put("mail.transport.protocol", "smtps");
            props.put("mail.smtps.host", SMTP_HOST_NAME);
            props.put("mail.smtps.auth", "true");

            Session mailSession = Session.getDefaultInstance(props);
            mailSession.setDebug(true);
            Transport transport;

            transport = mailSession.getTransport();


            MimeMessage message = new MimeMessage(mailSession);
            message.setSubject(titulo);
            message.setContent(corpo, "text/plain");

            for(String mail : para) {
                message.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(mail));
            }
            
            for(String mail : cc) {
                message.addRecipient(Message.RecipientType.CC,
                    new InternetAddress(mail));
            }

            for(String mail : cco) {
                message.addRecipient(Message.RecipientType.BCC,
                    new InternetAddress(mail));
            }

            transport.connect(SMTP_HOST_NAME, SMTP_HOST_PORT, SMTP_AUTH_USER, SMTP_AUTH_PWD);

            transport.sendMessage(message,
                    message.getRecipients(Message.RecipientType.TO));
            
            transport.close();

        } catch (MessagingException ex) {
            throw new RuntimeException(ex);
        } 


    }
}
